if is_price_available: # 数据就绪时整理结果并比较不同设置
high_correlation_pairs = weekly_state_table.loc[weekly_state_table['four_week_condition_met'],'asset_pair'].tolist() # 提取当前连续四周高正相关资产对
decision_table = pd.DataFrame([{'state_window_days':60,'state_sampling':'W-FRI','sensitivity_windows_weeks':'20/60/120','annualization_factor':252,'variance_unit':'年化日收益方差','portfolio_variance':portfolio_variance,'risk_budget':risk_budget,'positive_threshold':.8,'correlation_condition':'correlation_60d > 0.8 连续四周','high_correlation_pairs':high_correlation_pairs,'correlation_condition_met':correlation_condition_met,'variance_condition_met':variance_condition_met,'condition_met':portfolio_condition_met,'owner':'风控负责人','action':'核对共同因子并降低集中权重' if portfolio_condition_met else '保持权重并按周观察','review_note':'全部资产对不再连续四周高于0.8且年化方差回到0.04内;下一季度再次检查'}]) # 整理课堂结果和建议
weekly_return_panel = close_panel.resample('W-FRI').last().pct_change(fill_method=None).dropna() # 从真实周末价格生成周收益,避免把交易日误称为周
sensitivity_rows = [] # 初始化周窗口与阈值敏感性结果
for window_weeks in [20,60,120]: # 比较三种事先设定周收益窗口
for positive_threshold in [.7,.8,.9]: # 比较三档课堂正相关阈值
qualifying_pair_count = 0 # 统计曾满足连续四周条件的资产对数
qualifying_week_count = 0 # 统计全部资产对的满足条件周数
for left_position,left_code in enumerate(weekly_return_panel.columns): # 逐个选择左侧资产
for right_code in weekly_return_panel.columns[left_position+1:]: # 仅遍历不重复右侧资产
rolling_weekly_correlation = weekly_return_panel[left_code].rolling(window_weeks).corr(weekly_return_panel[right_code]) # 按周收益窗口计算相关序列
weekly_threshold_breach = rolling_weekly_correlation.gt(positive_threshold) # 标记正相关越过课堂阈值的周
four_week_condition_met = weekly_threshold_breach.rolling(4,min_periods=4).sum().eq(4) # 仅连续四周越界时满足条件
qualifying_pair_count += int(four_week_condition_met.any()) # 汇总曾满足条件的资产对
qualifying_week_count += int(four_week_condition_met.sum()) # 汇总持续满足条件的周数
sensitivity_rows.append({'window_weeks':window_weeks,'positive_threshold':positive_threshold,'pair_count':6,'qualifying_pairs':qualifying_pair_count,'qualifying_weeks':qualifying_week_count}) # 保存覆盖全部6对的频率清晰敏感性情景
sensitivity_table = pd.DataFrame(sensitivity_rows) # 汇总九种周窗口与阈值情景
if len(sensitivity_table)!=9 or not sensitivity_table['pair_count'].eq(6).all(): # 核验九情景均覆盖四资产全部6对
raise ValueError('输入文件、字段、样本量或数值不符合当前分析要求,请按本页说明检查') # 敏感性覆盖不足时停止
student_portfolio_variance,student_weekly_state_table,student_sensitivity_table = portfolio_variance,weekly_state_table.copy(),sensitivity_table.copy() # 同时锁定本章计算方差、全部6对状态与九行情景以免后续示例数据覆盖
strongest_pair = correlation_matrix.where(~np.eye(len(correlation_matrix),dtype=bool)).stack().idxmax() # 定位最高样本相关资产对
print({'status':'READY','name_audit':name_audit['status'],'assets':len(observed_codes),'rows':len(return_panel),'period':[str(return_panel.index.min().date()),str(return_panel.index.max().date())],'missing':missing_observations.to_dict()}) # 输出绑定期间与覆盖依据
print({'strongest_pair':' / '.join(strongest_pair),'correlation':round(float(correlation_matrix.loc[strongest_pair]),3),'portfolio_variance':round(portfolio_variance,6),'risk_budget':risk_budget,'condition_met':portfolio_condition_met}) # 输出关系与满足条件依据
print({'weekly_pairs':len(weekly_state_table),'sensitivity_scenarios':len(sensitivity_table),'owner':decision_table.at[0,'owner'],'action':decision_table.at[0,'action']}) # 输出比较范围和建议